import { setToken, getToken, removeToken } from '@/utils/auth'
import { getUserInfoAPI, loginAPI } from '@/api/user'
import { constantRoutes } from '@/router'
import { resetRouter } from '@/router'
// 存储状态的节点
const state = {
  token: getToken(), // 用户token,加()才是方法调用
  userInfo: {}, // 路由信息
  routes: [] // 路由信息，默认是静态路由
}

// 同步操作的节点：储存状态的中介

const mutations = {
  /**
   * 存储动态路由
   * @param {*} state
   * @param {*} newRoutes 新筛选出来的路由
   */
  setRoutes(state, newRoutes) {
    // 错误写法：该写法会将原来的静态路由都覆盖,只剩newRoutes
    // state.routes = newToken
    // 正确写法：使用数组合并，保证有新路由的同时,静态路由依然在
    state.routes = [...constantRoutes, ...newRoutes]
  },
  /**
   * 存储用户token
   * @param {*} state 当前模块的状态对象
   * @param {*} newToken 要存储的token
   */
  setUserToken(state, newToken) {
    // VueX临时存储
    state.token = newToken
    // Cookies本地持久化存储
    setToken(newToken)
  },
  /**
 * 存储用户基本信息的mutation
 * @param {object} userInfo 用户基本信息
 *
 */
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  },
  /**
   *清理VueX中的token + 清理本地缓存的token
   * @param {*} state
   */
  removeUserToken(state) {
    // 清理VueX中的token
    state.token = null
    // 清理本地缓存的token
    removeToken()
  }
}
// 异步操作的节点
/**
 * 登录action:发送登录请求获取tokens
 * @params context 上下文，调用commit提交mutations
 * @params loginForm 登录表单的数据对象  {mobile,password}
 *
 */
const actions = {
  /**
   *
   * @param {*} context
   */
  logout(context) {
  //  清理VueX中的token + 清理本地缓存的token
    context.commit('removeUserToken')
    // 清理VueX中的UserInfo
    context.commit('setUserInfo', {})
    // 重置路由：保证下一次登入项目时，路由都是新的
    resetRouter()
  },
  async login(context, loginForm) {
    // TODO(待做):调用登录接口方法，获取token
  // 假如登录成功，获取到token
    const token = await loginAPI(loginForm)
    // console.log(loginForm, token)
    // 调用commit提交mutations ,传递token
    context.commit('setUserToken', token)
  },
  async getUserInfo(context) {
    // 调用获取登录用户基本信息接口
    const userInfo = await getUserInfoAPI()
    // 提交mutations,储存userInfo
    context.commit('setUserInfo', userInfo)
    // 将获取的 用户基本信息返回给调用者(谁调用谁获取)
    return userInfo
  }
}
export default {
  // 命名空间
  namespaced: true,
  // 存储状态的节点
  state,
  // 同步操作的节点
  mutations,
  // 异步操作的节点
  actions

}
